package com.ruoyi.system.service.impl;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserFace;
import com.ruoyi.system.mapper.SysUserFaceMapper;
import com.ruoyi.system.service.ISysFaceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Base64;
import java.util.List;

/**
 * 人脸识别服务实现类
 *
 * @author ruoyi
 */
@Service
public class SysFaceServiceImpl implements ISysFaceService {

    @Autowired
    private SysUserFaceMapper userFaceMapper;

    /**
     * 模拟人脸识别 - 实际项目中需要集成真实的人脸识别SDK
     */
    @Override
    public Long verifyFace(String faceImageBase64) throws Exception {
        if (StringUtils.isEmpty(faceImageBase64)) {
            return null;
        }

        // 1. 将Base64字符串转换为图片字节数组
        byte[] imageBytes = Base64.getDecoder().decode(faceImageBase64);
        InputStream imageStream = new ByteArrayInputStream(imageBytes);

        try {
            // 2. 这里是模拟的人脸识别逻辑
            // 实际项目中需要集成真实的人脸识别SDK，提取人脸特征并进行比对

            // 3. 从数据库查询所有用户的人脸信息进行比对
            List<SysUserFace> userFaces = userFaceMapper.selectAllUserFace();

            // 模拟比对成功 - 实际项目中需要替换为真实的特征比对逻辑
            if (!userFaces.isEmpty()) {
                // 简单返回第一个用户ID作为演示
                return userFaces.get(0).getUserId();
            }

            return null;
        } finally {
            imageStream.close();
        }
    }

    /**
     * 保存用户人脸信息
     */
    @Transactional
    @Override
    public void saveFaceInfo(Long userId, String faceImageBase64) throws Exception {
        if (userId == null || StringUtils.isEmpty(faceImageBase64)) {
            throw new IllegalArgumentException("用户ID和人脸图像不能为空");
        }

        // 1. 先删除用户已有的人脸信息
        userFaceMapper.deleteUserFaceByUserId(userId);

        // 2. 转换图片格式
        byte[] imageBytes = Base64.getDecoder().decode(faceImageBase64);
        InputStream imageStream = new ByteArrayInputStream(imageBytes);

        try {
            // 3. 模拟提取人脸特征
            // 实际项目中需要调用SDK提取人脸特征
            String featureBase64 = "face_feature_" + userId + "_" + System.currentTimeMillis();

            // 4. 保存人脸信息到数据库
            SysUserFace userFace = new SysUserFace();
            userFace.setUserId(userId);
            userFace.setFaceImage(faceImageBase64); // 保存原始图片（可选）
            userFace.setFaceFeature(featureBase64); // 保存人脸特征
            userFaceMapper.insertUserFace(userFace);
        } finally {
            imageStream.close();
        }
    }

    /**
     * 删除用户人脸信息
     */
    @Transactional
    @Override
    public void deleteFaceInfo(Long userId) {
        if (userId != null) {
            userFaceMapper.deleteUserFaceByUserId(userId);
        }
    }

    /**
     * 根据用户ID查询人脸信息
     */
    @Override
    public SysUserFace selectUserFaceByUserId(Long userId) {
        return userFaceMapper.selectUserFaceByUserId(userId);
    }
}
